package com.mashibing.juc.c_025;

import java.util.Arrays;
import java.util.List;
import java.util.Random;
import java.util.concurrent.CopyOnWriteArrayList;

/**
 * 读的线程特别多，写的线程特别少，此时可以考虑使用CopyOnWriteArrayList
 * 读的时候不加锁
 * 写的时候在原来的基础上copy一个新的容器，copy完成之后在容器的最后扩展一个位置，把新元素放进去。
 * 之后把指向老容器的引用，重新指向新容器的引用
 */
public class T02_CopyOnWriteList {

    public static void main(String[] args) {
        List<String> list = new CopyOnWriteArrayList<>();//写时复制
        Random r = new Random();
        Thread[] ths = new Thread[100];
        for (int i = 0; i < ths.length; i++) {
            ths[i] = new Thread(()->{
                for (int j = 0; j < 1000; j++) list.add("a"+r.nextInt(10000));
            });
        }
        runAndComputeTime(ths);
        System.out.println(list.size());
    }

    static void runAndComputeTime(Thread[] ths){
        long s1 = System.currentTimeMillis();
        Arrays.asList(ths).forEach(t->t.start());
        Arrays.asList(ths).forEach(t->{
            try {
                t.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });
        long s2 = System.currentTimeMillis();
        System.out.println(s2 - s1);
    }
}
